/*
 * Conditions Of Use 
 * 
 * This software was developed by employees of the National Institute of
 * Standards and Technology (NIST), an agency of the Federal Government.
 * Pursuant to title 15 Untied States Code Section 105, works of NIST
 * employees are not subject to copyright protection in the United States
 * and are considered to be in the public domain.  As a result, a formal
 * license is not needed to use the software.
 * 
 * This software is provided by NIST as a service and is expressly
 * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
 * AND DATA ACCURACY.  NIST does not warrant or make any representations
 * regarding the use of the software or the results thereof, including but
 * not limited to the correctness, accuracy, reliability or usefulness of
 * the software.
 * 
 * Permission to use this software is contingent upon your acceptance
 * of the terms of this agreement
 *  
 * .
 * 
 */
/*******************************************************************************
 * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
 *******************************************************************************/
package gov.nist.javax.sip.header;

import javax.sip.InvalidArgumentException;
import java.text.ParseException;

/**
 * RAck SIP Header implementation
 * 
 * @version 1.2 $Revision: 1.6 $ $Date: 2006/08/15 21:44:51 $
 * 
 * @author M. Ranganathan <br/>
 * 
 * 
 */
public class RAck extends SIPHeader implements javax.sip.header.RAckHeader {

	/**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 743999286077404118L;

	protected long cSeqNumber;

	protected long rSeqNumber;

	protected String method;

	/** Creates a new instance of RAck */
	public RAck() {
		super(NAME);
	}

	/**
	 * Encode the body of this header (the stuff that follows headerName). A.K.A
	 * headerValue.
	 * 
	 */
	protected String encodeBody() {
		// Bug reported by Bruno Konik - was encoded in
		// the wrong order.
		return new StringBuffer().append(rSeqNumber).append(SP).append(
				cSeqNumber).append(SP).append(method).toString();

	}

	/**
	 * Gets the CSeq sequence number of this RAckHeader.
	 * 
	 * @deprecated
	 * @return the integer value of the cSeq number of the RAckHeader
	 */
	public int getCSeqNumber() {
		return (int) cSeqNumber;
	}

	/**
	 * Gets the CSeq sequence number of this RAckHeader.
	 * 
	 * @return the integer value of the cSeq number of the RAckHeader
	 */
	public long getCSeqNumberLong() {
		return cSeqNumber;
	}

	/**
	 * Gets the method of RAckHeader
	 * 
	 * @return method of RAckHeader
	 */
	public String getMethod() {
		return this.method;
	}

	/**
	 * Gets the RSeq sequence number of this RAckHeader.
	 * 
	 * @deprecated
	 * @return the integer value of the RSeq number of the RAckHeader
	 */
	public int getRSeqNumber() {
		return (int) rSeqNumber;
	}

	/**
	 * @deprecated
	 * @see javax.sip.header.RAckHeader#setCSeqNumber(int)
	 */
	public void setCSeqNumber(int cSeqNumber) throws InvalidArgumentException {
		this.setCSequenceNumber(cSeqNumber);
	}

	public void setMethod(String method) throws ParseException {
		this.method = method;
	}

	
	public long getCSequenceNumber() {
		return this.cSeqNumber;
	}

	public long getRSequenceNumber() {
		return this.rSeqNumber;
	}

	public void setCSequenceNumber(long cSeqNumber)
			throws InvalidArgumentException {
		if (cSeqNumber <= 0 || cSeqNumber > ((long) 1) << 32 - 1)
			throw new InvalidArgumentException("Bad CSeq # " + cSeqNumber);
		this.cSeqNumber = cSeqNumber;

	}

	/**
	 *@deprecated
	 * @see javax.sip.header.RAckHeader#setRSeqNumber(int)
	 */
	public void setRSeqNumber(int rSeqNumber) throws InvalidArgumentException {
		this.setRSequenceNumber(rSeqNumber);
	}

	
	public void setRSequenceNumber(long rSeqNumber)
			throws InvalidArgumentException {
		if (rSeqNumber <= 0 || cSeqNumber > ((long) 1) << 32 - 1)
			throw new InvalidArgumentException("Bad rSeq # " + rSeqNumber);
		this.rSeqNumber = rSeqNumber;
	}
}
